//
// Created by 11510 on 2024/6/19.
//
#include<iostream>

using std::endl;
using std::cout;

class A {
public:
    virtual void a() { cout << "A::a()" << endl; }

    void b() { cout << "A::b()" << endl; }

    virtual void c() { cout << "A::c()" << endl; }

    void e() { cout << "A::e()" << endl; }
};

class B {
public:
    virtual void a() { cout << "B::a()" << endl; }

    void c() { cout << "B::c()" << endl; }

    void d() { cout << "B::d()" << endl; }

    virtual void f() { cout << "B::f()" << endl; }
};

class C : public A, public B {
public:
    virtual void a() { cout << "C::a()" << endl; }

    virtual void b() { cout << "C::b()" << endl; }

    void c() { cout << "C::c()" << endl; }

    void d() { cout << "C::d()" << endl; }
};

void test0() {
    /**
     * C::a()
     * C::b()
     * C::c()
     * C::d()
     * A::e()
     * B::f()
     */
//    未通过指针调用，均未访问虚表
    C c;
    c.a();
    c.b();
    c.c();
    c.d();
    c.e();
    c.f();
    cout << endl;

    /**
     * C::a()
     * A::b()
     * C::c()
     * A::e()
     *
     */
    A* pa = &c;
    pa->a();/* 覆盖 */
    pa->b();
    pa->c();/* 覆盖 */
//    pa->d();  子类自定义的方法父类不可访问
    pa->e();
//    pa->f(); B类的方法A的指针不可访问
    cout << endl;

    /*
     * C::a()
     * B::c()
     * B::d()
     * B::f()
     */
    B* pb = &c;
    pb->a();/* 访问虚表但是goto C::a()*/
//    pb->b(); 子类自定义的方法父类不可访问
    pb->c();/* 不是虚函数 */
    pb->d();/* 不是虚函数 */
//    pb->e();
    pb->f();/* 访问虚表，但是子类未覆盖此方法，所以调B::f()*/
    cout << endl;


    /**
     * C::a()
     * C::b()
     * C::c()
     * C::d()
     * A::e()
     * B::f()
     */
    C * pc = &c;
    pc->a();/* 访问虚表，但是没触发多态 */
    pc->b();/* 访问虚表，但是没触发多态 */
    pc->c();/* 覆盖A的c() */
    pc->d();/* 隐藏 */
    pc->e();/* 仅仅继承 */
    pc->f();/* 访问虚表，但是没触发多态 */
}

int main(void) {
    test0();
    return 0;
}